2 תשובות
יש לך אחלה מדריך כאן:
http://www.slideshare.net/datacharmer/mysql-partitions-tutorial
כשאתה מתחיל לחשוב על partitioning זה כבר כשאתה מגיע לטבלאות של מיליארדים של שורות, כשאתה מגיע למצב
שבכל יום נכנסים לך כמויות עצומות של מידע, ואתה צריך בסופו של דבר להפיק ממנו משהו אמיתי.
אחד מהתהליכים של לעשות אופטימיזציה של הטבלאות שמכילות את הדטה הזה זה לעשות בעצם "partitioning".
כמו שאתה מחלק את ההארדדיסק שלך לחלוקות שונות, partitons שונה, ככה אתה גם יכול להגדיר לטבלה מסוימת לחלק מידע לpartitionים שונים.
לדוגמה, יש לי טבלה שמכילה 100 מליון רשומות, ואני מריץ את השאילתה הבאה:
select * from users_log where date = '2013-10-23' and userId = '10';
אם תעשה לשאילתה explain, תראה שהוא עובד מול כל ה100 מליון רשומות ומפלטר לפי היוזר אידי שנתת לו.
עכשיו, אם נגדיר partition מסוג range (קיימים כיום 4 סוגים), ובעצם נגיד לו
לפי העמודה date, תעשה לי partitioning יומי, בעצם בכל insert שתעשה לטבלה הוא יחפש את הpartition המתאים לעמודה date ויכניס לשם, ובעצם הוא עושה חלוקה של המידע לפי הימים.
למה זה טוב? כי הפעם שתריץ את השאילתה הבאה:
select * from users_log where date = '2013-10-23' and userId = '10';
במקום שהוא יתחיל לעבוד מול 100 מליון רשומות, הוא יגש לpartition של היום 23 לאוקטובר, ויעבוד מול הדטה שנמצא שם, שיכול להסתכם רק בעשר אלף רשומות, וכבר האצת בהרבה את העבודה של mysql.
לפירוט יותר מורחב ויותר טוב, ממליץ לך מאוד לקרוא את כל הסלייד ששלחתי לך, הוא מסביר את זה שם בצורה מעולה.
פירוט קטן על חסרונות:
mysql (עד גרסה 5.6) יכול להגדיר רק עד 1024 partitions לטבלה. כלומר, אם תעשה חלוקה יומית, זה אומר שהטבלה שלך מקסימום תכיל מידע עבור 1024 ימים מהיום שהגדרת אותו. ב5.6 הגדילו את זה לאיזור ה8 אלף partitions.
עם כמה שזה נשמע דבר טוב, המגבלה של ה1024/8000 היא מגבלה שדורשת ממך לחשוב מראש כבר על העתיד ולעשות design נכון למבנה של הדטהבייס שלך אחרת זה מיותר. יש גם מאמר נחמד כאן: http://www.mysqlperformanceblog.com/2010/12/11/mysql-partitioning-can-save-you-or-kill-you/ שמתאר מקרים ריאלים לחולטין שבמקום לייעל לך את הביצועים, הוא יפחית לך בהם ולא יתן לך שום תועלת. חשוב לבחון באמת אם צריך partitions, לפי איזו עמודה לעשות חלוקה, ובאיזו צורה. פלוס נתקלתי כבר במקרה שמצאתי באג בmysql בנושא הזה :)